package com.ylkj.common.util;

import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Properties;

import org.apache.commons.io.IOUtils;

/**
 * properties工具类.
 * 
 * @author 呼云飞
 */
public class PropsUtil {

    /**
     * 加载类路径上指定的属性文件。参数如"a.properties"，"conf/b.properties"。
     * 如果找不到文件，返回empty。
     * @throws RuntimeException 参数为空，或加载错误
     */
    public static Properties loadProps(String propsPath) throws RuntimeException {
        if(StringUtil.isEmpty(propsPath))
            throw new IllegalArgumentException("properties path is required");

        InputStream is = null;
        try {
            Properties ps = new Properties();
            if(!propsPath.endsWith(".properties")) propsPath += ".properties";
            is = ClassUtil.getClassLoader().getResourceAsStream(propsPath);
            if(is != null) {
                ps.load(is);
            }
            return ps;
        }
        catch(IOException ie) {
            throw new RuntimeException("加载属性文件["+propsPath+"] 出错：" + ie.toString(), ie);
        }
        finally {
            IOUtils.closeQuietly(is);
        }
    }

    /**
     * 将 {@link #loadProps(String)} 的结果转存到一个新的Map 里返回
     */
    public static Map<String, String> loadPropsToMap(String propsPath) throws RuntimeException {
        Map<String, String> map = new HashMap<String, String>();
        Properties props = loadProps(propsPath);
        for (String key : props.stringPropertyNames()) {
            map.put(key, props.getProperty(key));
        }
        return map;
    }

    /**
     * 如果props 包含key 属性，返回其值；否则返回empty
     */
    public static String getString(Properties props, String key) {
        String value = "";
        if (props.containsKey(key)) {
            value = props.getProperty(key);
        }
        return value;
    }

    /**
     * 如果props 包含key 属性，返回其值；否则返回defaultValue
     */
    public static String getString(Properties props, String key, String defaultValue) {
        String value = defaultValue;
        if (props.containsKey(key)) {
            value = props.getProperty(key);
        }
        return value;
    }

    /**
     * 获取数值型属性
     */
    public static int getNumber(Properties props, String key) {
        int value = 0;
        if (props.containsKey(key)) {
            value = CastUtil.castInt(props.getProperty(key));
        }
        return value;
    }

    /**
     * 获取数值型属性（带有默认值）
     */
    public static int getNumber(Properties props, String key, int defaultValue) {
        int value = defaultValue;
        if (props.containsKey(key)) {
            value = CastUtil.castInt(props.getProperty(key));
        }
        return value;
    }

    /**
     * 获取布尔型属性
     */
    public static boolean getBoolean(Properties props, String key) {
        return getBoolean(props, key, false);
    }

    /**
     * 获取布尔型属性（带有默认值）
     */
    public static boolean getBoolean(Properties props, String key, boolean defalutValue) {
        boolean value = defalutValue;
        if (props.containsKey(key)) {
            value = CastUtil.castBoolean(props.getProperty(key));
        }
        return value;
    }

    /**
     * 例如{a.x=1, a.y=2, z=3}，prefix="a."，返回Map {a.x=1, a.y=2}。
     *
     * <p>prefix 为null/empty 时返回原properties 的拷贝。
     */
    public static Map<String, Object> getMap(Properties props, String prefix) {
        if(prefix == null) prefix = "";
        Map<String, Object> kvMap = new LinkedHashMap<String, Object>();
        for (String key : props.stringPropertyNames()) {
            if (key.startsWith(prefix)) {
                String value = props.getProperty(key);
                kvMap.put(key, value);
            }
        }
        return kvMap;
    }
}
